From 9bab2acc924790b0a01a08e76f9216acc2d6528b Mon Sep 17 00:00:00 2001
From: Allan Sandfeld Jensen <allan.jensen@qt.io>
Date: Thu, 16 May 2019 11:19:49 +0200
Subject: [Backport] WebSQL: Explicitly initialize SQLite, remove deprecated
 API usage.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Change-Id: I291dd041c5646c4fdd714ff98dd939566861d921
Reviewed-on: https://chromium-review.googlesource.com/892092
Task-number: QTBUG-75853
Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
---
 .../Source/modules/webdatabase/DatabaseTracker.cpp  |  2 +-
 .../modules/webdatabase/sqlite/SQLiteFileSystem.cpp | 21 ++++++++++++++++++++-
 .../modules/webdatabase/sqlite/SQLiteFileSystem.h   | 21 +++++++++++++++------
 .../webdatabase/sqlite/SQLiteFileSystemPosix.cpp    | 19 ++++++++++---------
 .../webdatabase/sqlite/SQLiteFileSystemWin.cpp      | 19 ++++++++++---------
 5 files changed, 56 insertions(+), 26 deletions(-)

diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp
index 13ea7d8181..f78d90a5df 100644
--- a/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp
+++ b/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp
@@ -66,7 +66,7 @@ DatabaseTracker& DatabaseTracker::tracker() {
 }
 
 DatabaseTracker::DatabaseTracker() {
-  SQLiteFileSystem::registerSQLiteVFS();
+  SQLiteFileSystem::initializeSQLite();
 }
 
 bool DatabaseTracker::canEstablishDatabase(DatabaseContext* databaseContext,
diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp
index 9c25341c57..2a6e140f9e 100644
--- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp
+++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp
@@ -39,9 +39,28 @@
 // platform-specific files SQLiteFileSystemChromium{Win|Posix}.cpp
 namespace blink {
 
-SQLiteFileSystem::SQLiteFileSystem() {}
+#if DCHECK_IS_ON()
+// static
+bool SQLiteFileSystem::initialize_sqlite_called_ = false;
+#endif  // DCHECK_IS_ON
 
+// static
+void SQLiteFileSystem::initializeSQLite() {
+#if DCHECK_IS_ON()
+  DCHECK(!initialize_sqlite_called_) << __func__ << " already called";
+  initialize_sqlite_called_ = true;
+#endif  // DCHECK_IS_ON()
+
+  sqlite3_initialize();
+  registerSQLiteVFS();
+}
+
+// static
 int SQLiteFileSystem::openDatabase(const String& filename, sqlite3** database) {
+#if DCHECK_IS_ON()
+  DCHECK(initialize_sqlite_called_)
+      << "InitializeSQLite() must be called before " << __func__;
+#endif  // DCHECK_IS_ON()
   SafePointScope scope(BlinkGC::HeapPointersOnStack);
   return sqlite3_open_v2(filename.utf8().data(), database,
                          SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h
index 97c0ad83a1..af2bcd9211 100644
--- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h
+++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h
@@ -42,22 +42,31 @@ namespace blink {
 // A class that abstracts the file system related operations required
 // by the WebKit database code.
 class SQLiteFileSystem {
-  DISALLOW_NEW();
-
  public:
-  // Registers a user-defined SQLite VFS.
-  static void registerSQLiteVFS();
+  // This class is used as a namespace, so instantiating it doesn't make sense.
+  SQLiteFileSystem() = delete;
+
+  // Initializes SQLite for Blink's use.
+  //
+  // This must be called exactly once in each renderer process that uses SQLite.
+  static void initializeSQLite();
 
   // Opens a database file.
   //
+  // initializeSQLite() must be called before this method is called.
+  //
   // filemame - The name of the database file.
   // database - The SQLite structure that represents the database stored
   //            in the given file.
   static int openDatabase(const String& filename, sqlite3** database);
 
  private:
-  // do not instantiate this class
-  SQLiteFileSystem();
+  // Registers Chromium's VFS with SQLite.
+  static void registerSQLiteVFS();
+
+#if DCHECK_IS_ON()
+  static bool initialize_sqlite_called_;
+#endif  // DCHECK_IS_ON()
 };  // class SQLiteFileSystem
 
 }  // namespace blink
diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
index 77e7b6d904..20d0fd2e0e 100644
--- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
+++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
@@ -321,11 +321,6 @@ int chromiumSleep(sqlite3_vfs* vfs, int microseconds) {
   return wrappedVfs->xSleep(wrappedVfs, microseconds);
 }
 
-int chromiumCurrentTime(sqlite3_vfs* vfs, double* prNow) {
-  sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
-  return wrappedVfs->xCurrentTime(wrappedVfs, prNow);
-}
-
 int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) {
   // xGetLastError() has never been used by SQLite.  The implementation in
   // os_win.c indicates this is a reasonable implementation.
@@ -333,6 +328,11 @@ int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) {
   return 0;
 }
 
+int chromiumCurrentTimeInt64(sqlite3_vfs* vfs, sqlite3_int64* now) {
+  sqlite3_vfs* wrapped_vfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
+  return wrapped_vfs->xCurrentTimeInt64(wrapped_vfs, now);
+}
+
 }  // namespace
 
 void SQLiteFileSystem::registerSQLiteVFS() {
@@ -342,9 +342,9 @@ void SQLiteFileSystem::registerSQLiteVFS() {
   // TODO(shess): Implement local versions.
   ASSERT(wrappedVfs->xRandomness);
   ASSERT(wrappedVfs->xSleep);
-  ASSERT(wrappedVfs->xCurrentTime);
+  ASSERT(wrappedVfs->xCurrentTimeInt64);
 
-  static sqlite3_vfs chromium_vfs = {1,
+  static sqlite3_vfs chromium_vfs = {2,
                                      sizeof(chromiumVfsFile),
                                      wrappedVfs->mxPathname,
                                      0,
@@ -360,8 +360,9 @@ void SQLiteFileSystem::registerSQLiteVFS() {
                                      chromiumDlClose,
                                      chromiumRandomness,
                                      chromiumSleep,
-                                     chromiumCurrentTime,
-                                     chromiumGetLastError};
+                                     nullptr,  // CurrentTime is deprecated.
+                                     chromiumGetLastError,
+                                     chromiumCurrentTimeInt64};
   sqlite3_vfs_register(&chromium_vfs, 0);
 }
 
diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp
index 2933df65f6..31103047fd 100644
--- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp
+++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp
@@ -148,11 +148,6 @@ int chromiumSleep(sqlite3_vfs* vfs, int microseconds) {
   return wrappedVfs->xSleep(wrappedVfs, microseconds);
 }
 
-int chromiumCurrentTime(sqlite3_vfs* vfs, double* prNow) {
-  sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
-  return wrappedVfs->xCurrentTime(wrappedVfs, prNow);
-}
-
 int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) {
   // xGetLastError() has never been used by SQLite.  The implementation in
   // os_win.c indicates this is a reasonable implementation.
@@ -160,6 +155,11 @@ int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) {
   return 0;
 }
 
+int chromiumCurrentTimeInt64(sqlite3_vfs* vfs, sqlite3_int64* now) {
+  sqlite3_vfs* wrapped_vfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
+  return wrapped_vfs->xCurrentTimeInt64(wrapped_vfs, now);
+}
+
 }  // namespace
 
 void SQLiteFileSystem::registerSQLiteVFS() {
@@ -169,9 +169,9 @@ void SQLiteFileSystem::registerSQLiteVFS() {
   // TODO(shess): Implement local versions.
   ASSERT(wrappedVfs->xRandomness);
   ASSERT(wrappedVfs->xSleep);
-  ASSERT(wrappedVfs->xCurrentTime);
+  ASSERT(wrappedVfs->xCurrentTimeInt64);
 
-  static sqlite3_vfs chromium_vfs = {1,
+  static sqlite3_vfs chromium_vfs = {2,
                                      wrappedVfs->szOsFile,
                                      wrappedVfs->mxPathname,
                                      0,
@@ -187,8 +187,9 @@ void SQLiteFileSystem::registerSQLiteVFS() {
                                      chromiumDlClose,
                                      chromiumRandomness,
                                      chromiumSleep,
-                                     chromiumCurrentTime,
-                                     chromiumGetLastError};
+                                     nullptr,  // CurrentTime is deprecated.
+                                     chromiumGetLastError,
+                                     chromiumCurrentTimeInt64};
   sqlite3_vfs_register(&chromium_vfs, 0);
 }
 
-- 
cgit v1.2.1

